package abstractClass;

abstract class Graphics {
    double perimeter;//周长
    static int cnt = 0;

    void draw() {
        System.out.println("绘制图形");
    }

    abstract void isWhat();

    Graphics() {
        this.perimeter = 0;
        Graphics.cnt++;
    }

    Graphics(double perimeter) {
        this.perimeter = perimeter;
        Graphics.cnt++;
    }
}

class Circle extends Graphics {
    @Override
    void draw() {
        System.out.println("绘制一个周长为: "+perimeter+"的圆");
    }

    @Override
    void isWhat() {
        System.out.println("这是一个周长为: "+perimeter+"的圆");
    }

    Circle() {
        super();
    }

    Circle(double perimeter) {
        super(perimeter);
    }
}

class Rectangle extends Graphics {
    @Override
    void draw() {
        System.out.println("绘制一个矩形周长为: "+perimeter+"的矩形");
    }

    @Override
    void isWhat() {
        System.out.println("这是一个矩形周长为: "+perimeter+"的矩形");
    }

    public Rectangle() {
        super();
    }

    public Rectangle(double perimeter) {
        super(perimeter);
    }
}

public class Test {
    public static void main(String[] args) {
        //接口：
        //1.接口当中的字段(属性)默认被修饰成 public static final


    }


    public static void main1(String[] args) {
        //抽象类:
        //1.通过abstract 修饰的类就是抽象类
        //2.抽象类中也可以包含普通类所能包含的属性与方法
        //3.抽象类中可以没有抽象方法(abstract修饰的方法)
        //4.抽象方法不能有主体(不能有具体实现)
        //5.抽象方法必须能满足重写的要求(不能被 private final static 因为子类要进行重写)
        //6.抽象类不能被实例化 但可以有构造方法帮助实例化子类
        //7.在继承了抽象类的子类中必须重写抽象方法
        //8.抽象类存在的最大意义就是被继承
        //9.一个抽象类可以继承另一个抽象类 但这个抽象类的子类就必须重写这两个或对应继承的多个抽象类中的抽象方法

        Graphics g1=new Circle(10);
        Graphics g2=new Rectangle(100);
        g1.draw();
        g1.isWhat();
        g2.draw();
        g2.isWhat();
        System.out.println("现在已经有了 "+Graphics.cnt+" 个图形");
        /*
         * 绘制一个周长为: 10.0的圆
         * 这是一个周长为: 10.0的圆
         * 绘制一个矩形周长为: 100.0的矩形
         * 这是一个矩形周长为: 100.0的矩形
         * 现在已经有了 2 个图形
         */
    }
}
